home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Progress Indicators / LAGAProgressIndicator.cp < prev    next >
Text File  |  1996-06-30  |  8KB  |  271 lines

  1. // ===========================================================================
  2. //    LAGAProgressIndicator.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant Determinate progress indicator control
  5. //    Copyright © 1996 Chrisoft (Christophe ANDRES)  All rights reserved.
  6. //
  7. //    You may use this source code in any application (commercial, shareware, freeware,
  8. //    postcardware, etc), but not remove this notice (no need to acknowledge the use of
  9. //    this class in the about box)
  10. //    You may not sell this source code in any form. This source code may be placed on 
  11. //    publicly accessable archive sites and source code disks. It may not be placed on 
  12. //    profit archive sites and source code disks without the permission of the author, 
  13. //    Christophe ANDRES.
  14. //    
  15. //        This source code is distributed in the hope that it will be useful,
  16. //        but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. //        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. //
  19. //    If you make any change or improvement on this class, please send the improved/changed
  20. //    version to : chrisoft@calva.net or Christophe ANDRES
  21. //                                     20, rue Prosper Mérimée
  22. //                                     67100 STRASBOURG
  23. //                                     FRANCE
  24. //
  25. // ===========================================================================
  26. //    LAGAProgressIndicator.h            <- double-click + Command-D to see class declaration
  27. //
  28. //    LAGAProgressIndicator is my implementation of the “Apple Grayscale Appearance for System 7.5”
  29. //        determinate progress indicator.
  30. //        Use the IncrementValue or SetValue methods to update the progress indicator
  31. //
  32. //        This class requires AGAColors.cp to be present in your project
  33. //
  34. //        Version : 1.2
  35. //
  36. //        Change History (most recent first, date in US form : mm/dd/yy):
  37. //
  38. //                        06/30/96    ca        Public release of version 1.2
  39. //                        06/28/96    ca        Bug in SetMaxValue : wrongly affected inMaxValue to mMinValue
  40. //                        06/04/96    ca        added RegisterClass method for easy registry
  41. //                                                        Increased version to 1.2
  42. //                        05/21/96    ca        class made available by Christophe ANDRES <chrisoft@calva.net>
  43. //                                                        (version 1.1)
  44. //
  45. //        To Do:
  46. //
  47.  
  48. #include "LAGAProgressIndicator.h"
  49.  
  50. #include <UEnvironment.h>
  51. #include "AGAColors.h"
  52.  
  53. const short kIndicatorHeight = 14;
  54. const short kMinimumWidth = 8;
  55.  
  56. //    begin    <06/04/96    ca>
  57. void LAGAProgressIndicator::RegisterClass ()
  58.  
  59. {
  60.     URegistrar::RegisterClass(LAGAProgressIndicator::class_ID, (ClassCreatorFunc)LAGAProgressIndicator::CreateAGAProgressIndicatorStream);
  61. }
  62. //    end    <06/04/96    ca>
  63.  
  64. LAGAProgressIndicator* LAGAProgressIndicator::CreateAGAProgressIndicatorStream (LStream* inStream)
  65.  
  66. {
  67.     return (new LAGAProgressIndicator(inStream));
  68. }
  69.  
  70. //-------Constructors-------------------------------------------------------------------------------------------------
  71.  
  72. LAGAProgressIndicator::LAGAProgressIndicator (LStream *inStream) : LPane(inStream)
  73.  
  74. {
  75.     inStream->ReadData(&mValue, sizeof(Int32));
  76.     inStream->ReadData(&mMinValue, sizeof(Int32));
  77.     inStream->ReadData(&mMaxValue, sizeof(Int32));
  78.     
  79.     //    Boundary checks
  80.     if (mMinValue >= mMaxValue)
  81.         mMaxValue = mMinValue + 10;
  82.     if ((mValue < mMinValue) || (mValue > mMaxValue))
  83.         mValue = mMinValue;
  84.         
  85.     if (mFrameSize.height < kIndicatorHeight)
  86.         mFrameSize.height = kIndicatorHeight;
  87.     if (mFrameSize.width < kMinimumWidth)
  88.         mFrameSize.width = kMinimumWidth;
  89. }
  90.  
  91. LAGAProgressIndicator::LAGAProgressIndicator (const LAGAProgressIndicator &inOriginal) : LPane(inOriginal)
  92.  
  93. {
  94.     mMinValue = inOriginal.mMinValue;
  95.     mMaxValue = inOriginal.mMaxValue;
  96.     mValue = inOriginal.mValue;
  97.     
  98.     //    Boundary checks
  99.     if (mMinValue >= mMaxValue)
  100.         mMaxValue = mMinValue + 10;
  101.     if ((mValue < mMinValue) || (mValue > mMaxValue))
  102.         mValue = mMinValue;
  103.         
  104.     if (mFrameSize.height < kIndicatorHeight)
  105.         mFrameSize.height = kIndicatorHeight;
  106.     if (mFrameSize.width < kMinimumWidth)
  107.         mFrameSize.width = kMinimumWidth;
  108. }
  109.  
  110. LAGAProgressIndicator::LAGAProgressIndicator (const SPaneInfo &inPaneInfo, Int32 inInitialValue, Int32 inMinValue, Int32 inMaxValue)
  111.                                                                                         : LPane(inPaneInfo)
  112. {
  113.     mMinValue = inMinValue;
  114.     mMaxValue = inMaxValue;
  115.     mValue = inInitialValue;
  116.     
  117.     //    Boundary checks
  118.     if (mMinValue >= mMaxValue)
  119.         mMaxValue = mMinValue + 10;
  120.     if ((mValue < mMinValue) || (mValue > mMaxValue))
  121.         mValue = mMinValue;
  122.         
  123.     if (mFrameSize.height < kIndicatorHeight)
  124.         mFrameSize.height = kIndicatorHeight;
  125.     if (mFrameSize.width < kMinimumWidth)
  126.         mFrameSize.width = kMinimumWidth;
  127. }
  128.  
  129. //-------Drawers----------------------------------------------------------------------------------------------------
  130.  
  131. void LAGAProgressIndicator::DrawSelf ()
  132.  
  133. {
  134.     StColorPenState theState;
  135.     Boolean hasColor = ::PaneInColor(this);
  136.     Rect frame;
  137.     
  138.     theState.Normalize();
  139.     CalcLocalFrameRect(frame);
  140.     frame.bottom = frame.top + kIndicatorHeight;
  141.     if (hasColor)
  142.         {
  143.             ::RGBForeColor(&gAGAColorArray[5]);
  144.             ::MoveTo(frame.left, frame.top + 12);
  145.             ::Line(0, -12);
  146.             ::LineTo(frame.right - 2, frame.top);
  147.             ::ForeColor(whiteColor);
  148.             ::Move(1, 1);        ::Line(0, 12);
  149.             ::LineTo(frame.left + 1, frame.bottom - 1);
  150.         }
  151.     ::ForeColor(blackColor);
  152.     ::InsetRect(&frame, 1, 1);
  153.     ::FrameRect(&frame);
  154.     ::InsetRect(&frame, 1, 1);
  155.     if (hasColor)
  156.         {
  157.             StClipRgnState theClip;
  158.             
  159.             theClip.ClipToIntersection(frame);
  160.             double size = (frame.right - frame.left) - 4;
  161.             double division = size / (double)((mMaxValue - 1) - mMinValue);
  162.             short indicLength = division * ((mValue - 1) - mMinValue);
  163.             
  164.             if (mValue > mMinValue)
  165.                 {
  166.                     ::RGBForeColor(&gAGAColorArray[8]);
  167.                     ::MoveTo(frame.left + 1, frame.top);
  168.                     ::Line(-1, 0);
  169.                     ::Line(0, 9);
  170.                     ::Move(1, -1);    ::Line(0, 0);
  171.                     ::Move(1, -1);    ::Line(indicLength, 0);
  172.                     ::Move(1, -6);    ::Line(-(indicLength + 1), 0);
  173.                     ::RGBForeColor(&gAGAColorArray[10]);
  174.                     ::Move(0, -1);    ::Line(indicLength + 2, 0);
  175.                     ::Move(2, 0);        ::Line(0, 9);
  176.                     ::Move(-3, -7);    ::Line(0, 6);
  177.                     ::Line(-(indicLength + 1), 0);
  178.                     ::Move(-1, 1);    ::Line(0, 0);
  179.                     ::RGBForeColor(&gAGAColorArray[5]);
  180.                     ::Move(0, -2);    ::Line(0, 0);
  181.                     ::Move(1, -1);    ::Line(indicLength, 0);
  182.                     ::Move(0, -4);    ::Line(-indicLength, 0);
  183.                     ::Move(-1, -1);    ::Line(0, 0);
  184.                     ::RGBForeColor(&gAGAColorArray[3]);
  185.                     ::Move(0, 1);        ::Line(0, 0);
  186.                     ::Move(1, 1);        ::Line(indicLength, 0);
  187.                     ::Line(0, 2);        ::Line(-indicLength, 0);
  188.                     ::Move(-1, 1);    ::Line(0, 0);
  189.                     ::RGBForeColor(&gAGAColorArray[1]);
  190.                     ::Move(0, -1);    ::Line(0, -2);
  191.                     ::Move(1, 1);        ::Line(indicLength - 1, 0);
  192.                     ::RGBForeColor(&gAGAColorArray[12]);
  193.                     ::Move(3, -3);    ::Line(0, 8);
  194.                     ::Line(-(indicLength + 2), 0);
  195.                     ::ForeColor(blackColor);
  196.                     ::Move(indicLength + 3, 0);
  197.                     ::Line(0, -9);
  198.                 }
  199.             if (mValue < mMaxValue)
  200.                 {
  201.                     ::RGBBackColor(&gAGAColorArray[4]);
  202.                     if (mValue > mMinValue)
  203.                         frame.left = frame.left + indicLength + 7;
  204.                     EraseRect(&frame);
  205.                     ::RGBForeColor(&gAGAColorArray[7]);
  206.                     ::MoveTo(frame.left, frame.bottom - 1);
  207.                     ::Line(0, -9);    ::LineTo(frame.right - 2, frame.top);
  208.                     ::RGBForeColor(&gAGAColorArray[2]);
  209.                     ::Move(1, 1);        ::Line(0, 8);
  210.                     ::LineTo(frame.left + 1, frame.bottom - 1);
  211.                 }
  212.         }
  213.     else
  214.         {
  215.             double size = frame.right - frame.left;
  216.             double division = size / (double)(mMaxValue - mMinValue);
  217.             
  218.             Rect r = frame;
  219.             r.right = r.left + (division * (mValue - mMinValue));
  220.             ::FillRect(&frame, &qd.black);
  221.             frame.left = r.right;
  222.             if (!::EmptyRect(&frame))
  223.                 EraseRect(&frame);
  224.         }
  225. }
  226.  
  227. void LAGAProgressIndicator::IncrementValue (Int32 inIncrement)
  228.  
  229. {
  230.     SetValue(mValue + inIncrement);
  231. }
  232.  
  233. void LAGAProgressIndicator::SetValue (Int32 inValue)
  234.  
  235. {
  236.     if ((inValue != mValue) && (inValue >= mMinValue) && (inValue <= mMaxValue))
  237.         {
  238.             mValue = inValue;
  239.             if (FocusDraw())
  240.                 DrawSelf();
  241.         }
  242. }
  243.  
  244. void LAGAProgressIndicator::SetMinValue (Int32 inMinValue)
  245.  
  246. {
  247.     if ((inMinValue != mMinValue) && (inMinValue <= mMaxValue))
  248.         {
  249.             if (mValue < inMinValue)
  250.                 mValue = inMinValue;
  251.             mMinValue = inMinValue;
  252.             if (FocusDraw())
  253.                 DrawSelf();
  254.         }
  255. }
  256.  
  257. void LAGAProgressIndicator::SetMaxValue (Int32 inMaxValue)
  258.  
  259. {
  260.     if ((inMaxValue != mMaxValue) && (inMaxValue >= mMinValue))
  261.         {
  262.             if (mValue > inMaxValue)
  263.                 mValue = inMaxValue;
  264.             mMaxValue = inMaxValue;                                                                                                                                                        //    <06/28/96    ca>
  265.             if (FocusDraw())
  266.                 DrawSelf();
  267.         }
  268. }
  269.  
  270.  
  271.